免杀技术浅析
一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:16004488
微信公众号:计算机与网络安全
ID:Computer-network
后门和木马希望能顺利绕过杀毒软件与防火墙,在受害者的计算机中长期隐藏下去,并能在必要的时候向攻击者提供有用的信息。
免杀技术全称为反杀毒技术Anti Anti- Virus简称“免杀”,它指的是一种能使病毒木马免于被杀毒软件查杀的技术。由于免杀技术的涉猎面非常广,其中包含反汇编、逆向工程、系统漏洞等黑客技术,所以难度很高,一般人不会或没能力接触这技术的深层内容。其内容基本上都是修改病毒、木马的内容改变特征码,从而躲避了杀毒软件的查杀。
一、什么是免杀
免杀就是定位特征码,所谓的“特征码”其实是从反病毒领域引进的一个词,意指相应病毒或木马所特有的一段二进制码。我们都知道,其实病毒与木马就是一个特殊的应用程序,鉴于其特殊性,它的文件结构与相应的二进制指令肯定是要与正常程序(比如正常的PE文件格式)是有所不同的。
当反病毒公司的相关技术人员得到一个病毒样本时,他最重要的任务之一就是找出这个病毒的“特征码”。
但是“特征码”究竟是从哪里来的呢?或者说相关技术人员是依靠什么找到特征码的呢?我们知道,一个正常的应用程序是不可能包含格式化所有硬盘的指令的,但是假如某个病毒包含这段“个性十足”的指令,那么我们将其对应的二进制码定位为特征码简直是再准确不过了。
事实上我们不容易碰到这种具有鲜明个性的病毒,但在给病毒定位特征码时所应用的原理是大同小异的。
不过,现实世界中的杀毒软件所用的特征码是异常复杂的,一般都是由数段特征片段加上一定的逻辑判断机制组合而成的。
相比较而言,破坏这种复杂的特征码显然要简单许多,我们只需要有计划地向病毒或木马文件中分批填入无用的垃圾信息即可。如果被垃圾信息覆盖后文件不再会被杀毒软件所查杀,那么我们就可以判定覆盖区域内一定存在特征码片段。不管这种覆盖是否包括了全部特征码,只要是杀毒软件不再查杀,那么目的就达到了。
二、正确认识免杀技术
1、免杀不是Rootkit技术
免杀与Rootkit(特殊的恶意软件)有许多相同之处,例如它们的最终目的都是隐藏自己不被其他程序发现。但是我们不能因此就说免杀就是Rootkit技术。
我们从单词Rootkit中的kit就不难发现,其实Rootkit的本质是指一组非常直接的工具,但是免杀只是使用这组工具的方法之一。
现在的免杀主要分为3种,其中的一种便是行为免杀,也就是通过控制病毒木马的行为来达到躲过杀毒软件主动防御检测的目的。而这种行为免杀所用到的处理技术之一就是通过Anti Rookit来使反病毒程序的Rootkit失效,从而不能有效地监测系统,达到一劳永逸的目的。当然,我们还可以通过对病毒或木马的调整来被动地达到行为免杀的效果。
因此我们可以看到,Rootkit并不能代表免杀技术,它只是构成高级免杀技巧的组成部分。
2、免杀不是加密解密技术
有很多人认为免杀其实就是破解技术的一个分支,例如对于程序的修改、脱壳加壳、对程序的加密解密等,这些都是免杀与加密解密的相同之处。
但是就两种技术所导致的行为来讲,它们主要存在以下不同:
加密解密技术是针对某一个程序展开研究,而免杀技术在任何时候都是针对两个程序展开研究。
加密解密技术是以某一程序为媒介所产生的技术对抗(例如程序保护者与破解者),免杀技术则是通过某一个程序对另外一个程序所产生的技术对抗(例如免杀的木马与杀毒软件)。
除此之外,加密解密技术大多是在没有源代码的情况下进行的(称为无源工作环境),而源码级免杀则是指通过直接修改源代码的方式达到免杀目的,它是一种有源工作环境下的技术。
三、免杀设计流程
(1)目标反病毒软件强度如何?
(2)目标反病毒软件有何弱点?
(3)目标反病毒软件使用了什么独特的反病毒技术?
(4)要怎样才能突破它?
(5)待处理的恶意程序是用什么语言编写的?
(6)待处理的恶意程序的二进制代码是否已经被混淆或加密过了?
(7)待处理的恶意程序的使用人群是否广泛?
从免杀需要收集的信息来看,首先要了解的是反病毒软件,其次才是恶意程序。由此我们可以推断出,如果黑客们想要比较全面透彻地收集反病毒软件的信息,那么势必要对反病毒软件有一定的研究才行。
四、反病毒软件原理与反病毒技术介绍
首先,反病毒软件仅仅是一个普通的软件,它之所以具有看似神奇的反病毒功能,不过是因为它被赋予了这种使命而已。一个反病毒软件的构造的复杂程度要远远高于木马或病毒,而且鉴于木马和病毒现在的发展趋势是越来越深入系统底层(Ring0层),反病毒软件也在不断地向系统底层靠近。例如现在的“主动防御”技术,就是应用系统底层的技巧。
关于系统底层,我们先来举一个简单的例子,如果有人想控制你的计算机,既可以通过软件也可以通过硬件,但如果你想要对这种控制进行防御,则需要安装另一种可以防范它的软件,或从硬件上做文章(比如给计算机加锁)。其中,软件是计算机中相对高层的,而硬件是底层的,也就是说,越靠近底层拥有的权力就越大。
从计算机原理来说,计算机中有一个用于控制CPU完成各项功能的命令系统,它叫做“指令系统”,指令系统将指令分为特权指令与普通指令。对于一些危险的指令(即绝大部分特权指令),只允许操作系统及其相关模块使用,而普通的应用程序只能使用那些不会造成灾难的指令(即普通指令)。Intel的CPU将特权级别分为4层,它们分别是Ring0、Ring1、Ring2与Ring3。Ring0为底层,也就是所谓的“内核层”,它也是操作系统的底层;Ring3为最高层,也就是用户层。目前Windows只使用其中的两个级别(这样既能实现安全的访问控制,又能降低系统的设计成本与复杂程度),它们是Ring0和Ring3层,Ring0只供操作系统使用,而Ring3谁都能用。但是使用一定的方法我们还是可以通过编写程序来“操控”Ring0层的指令。
1、反病毒软件的工作原理
反病毒软件一般由扫描器、病毒库与虚拟机组成,并由主程序将它们整合为一体,如图1所示。
图1 反病毒软件的程序结构
一般情况下,扫描器用于查杀病毒,它也是反病毒软件的核心。一个反病毒软件的效果好坏直接取决于扫描器的技术与算法是否先进。而且反病毒软件的不同功能往往对应着不同的扫描器,也就是说,大多数反病毒软件都是由多个扫描器组成的。
病毒库中存储着病毒所具有的独一无二的特征字符,我们称之为“特征码”。而病毒库存储特征码的存储形式则取决于扫描器采用哪种扫描技术。特征码可能存在于任何文件中,例如EXE文件、RMVB文件、JPG文件,甚至是txt文件中,所以它们也都有可能被查杀。
虚拟机可以使病毒在一个由反病毒软件构建的虚拟环境中执行,这样就与现实的CPU、硬盘等物理设备完全隔离了,从而可以更加深入地检测文件的安全性。
2、基于文件扫描的反病毒技术
基于文件扫描的反病毒技术可以分为“第一代扫描技术”、“第二代扫描技术”与“算法扫描”3种,对于黑客来说,只有对每一种扫描技术了如指掌,才能成为高手!
(1)第一代扫描技术
第一代扫描技术可以用“在文件中检索病毒特征序列”这句话来高度概括,由于目前大部分计算机书籍对病毒检测都停留在相当浅的层次上,所以通常都会用这句话来概述相关技术。其实第一代扫描技术直到现在也仍然被各大反病毒软件厂商使用着,其主要分为“字符串扫描技术”与“通配符扫描技术”两种。
1)字符串扫描技术
可以将此技术中的字符串理解为一段有意义或无意义的字符,例如“黑客免杀技术”、"OK"、"Windows"与“ww11好好22”等都是一段字符串。所以说此技术是检测计算机病毒最早的也是最简单的办法。
字符串扫描技术一般使用从病毒中提取出来的具有特征的一段字符来检测病毒,当然这些字符在一般程序中是不太可能出现的。例如一个隐藏执行格式化所有硬盘的命令是不可能出现在普通程序里的,如果某个应用程序包含了相应的特征字符,那么它就应该是病毒了。由此可见字符串扫描技术的原理还是比较简单的,但它却是反病毒软件扫描技术的思想发端。
2)通配符扫描技术
此技术中的通配符可以理解为具有一定意义的符号,例如DOS命令里的"*"号就是代表任意长度、任意字符的通配符,而且通配符在不同的领域中也可能会代表不同的意思。
由于字符串扫描技术有执行速度慢与特征码长度限制等问题,所以它正在逐渐退出历史舞台,而通配符扫描技术取而代之,因为它以同样简单的原理与技术实现了更为强大的功能,所以现在反病毒软件中简单的扫描器常常支持通配符。扫描器中的通配符一般用于跳过某些字节或字节范围,而现在大多数的扫描器已经支持正则表达式了。
下面我们通过一个例子来讲解通配符扫描技术的原理。例如我们的病毒库中有以下一段特征码:
可以将其解释为:
尝试匹配02,如果找到则继续,否则返回假。
尝试上一匹配目标后匹配0E,如果找到则继续,否则返回假。
尝试上一匹配目标后匹配07,如果找到则继续,否则返回假。
尝试上一匹配目标后匹配BB,如果找到则继续,否则返回假。
??表示忽略此字节。
尝试上一匹配目标后匹配02,如果找到则继续,否则返回假。
%3表示在接下来的3个位置(字节)中尝试匹配56,如果找到则继续,否则返回假。
尝试上一匹配目标后匹配C9,如果找到则继续,否则返回假。
这种扫描技术通常支持半字节匹配,这样可以更精确地匹配特征码。一些早期的加密病毒用这种方法都能比较容易地检测出来。
3)其他扫描技术
除了上面介绍的两种扫描技术外,还有一些其他的扫描技术,由于它们与免杀的关系不大,在这里只做一个简单的介绍。
不匹配字节数扫描技术:这是为IBM Antivirous软件开发的一种技术,它允许字符串中有N个字节为任意值。
通用检测法扫描技术:用一个简单的字符串来搜索某类病毒的部分或全部已知变种。
散列扫描技术:散列是一个常见的术语,这里指可以对特征码的首字节或第一个16位或32位字节进行计算,从而允许字符串后面的字节包含通配符。
书签检测法:这是一种保证病毒检测与清除过程更加准确的方法。
首尾扫描检测法:通过只扫描文件头部和尾部而加快病毒检测速度的复杂方法。
入口点和固定点扫描:可以进一步提升防毒扫描工具检测速度的一种方法。
文件名扫描法:这是国内某著名安全软件所使用的扫描方法,其原理是根据文件名及文件所在路径粗略地判断此文件是否是病毒的。
(2)第二代扫描技术
第二代扫描技术的代表为“近似精确识别法”与“精确识别法”,除此之外还有“智能扫描法”与“骨架扫描法”。从名字可以看出,第二代扫描技术对检测精度给予了充分的重视,因误杀而导致严重的后果是绝大部分反病毒软件厂商都不愿看到的,因此检测精度逐渐提高也在情理之中。
1)智能扫描法
这种方法是在大量变异病毒出现之后提出的。智能扫描法会忽略检测文件中像NOP这种无意义的指令。而对于文本格式的脚本病毒或宏病毒,则可以替换掉多余的格式字符,例如空格、换行符或制表符等。由于这一切替换动作往往是在扫描缓冲区中执行的,从而大大提高了扫描器的检测能力。
“缓冲区”其实就是一块内存空间,应用程序运行前都需要加载到内存中,而缓冲区就是系统向运行的程序分配的一块动态的空间。它存在的主要目的就是为了节省内存的开销,加快程序的运行速度。其实硬盘甚至光驱也是有缓冲区的,只不过从严格意义上来讲它们还是有一定差别的。
2)近似精确识别法
近似精确识别法包含了若干种方法,下面介绍的两种方法是比较具有代表性的扫描技术。
多套特征码:该方法采用两个或更多个字符串集来检测每个病毒,如果扫描器检测到其中一个特征符合,那么就会警告发现变种,但并不会执行下一步操作(例如清除病毒体或删除文件)。如果多个特征码全部符合,则报警发现病毒,并执行下一步操作。
校验和:对于校验和,也许您会想到文件校验和对比的方法,不过这个方法的思路是让每一个无毒的文件生成一个校验和,等待下次扫描时再进行简单的校验和对比。如果校验和有所变化,再做进一步的扫描,否则就说明这个文件没有被感染,这样有利于提升扫描器的效率。但是严格地说,这并不算是扫描技术。除此之外,某些安全产品还对病毒文件采取了分块校验的方式以提高准确性。
将校验和扫描技术利用得最为到位的就是比较出名的卡巴斯基了,它的第二代扫描器就采用了密码校验和技术,从而基本淘汰了搜索字符串技术。
关于校验和,其实是一个复杂的概念,简单地说就是通过对病毒中的某一段代码进行计算,从而得出一个值(例如123XY4),它与MD5文件校验有些相似。
3)骨架扫描法
此方法由卡巴斯基(Kaspersky)公司发明,在检测宏病毒时特别有用。它既不用特征码也不用校验和,而是通过逐行解析宏语句,并将所有非必要字符丢弃,只剩下代码的骨架,通过对代码骨架的分析,从而提高对变种病毒的检测能力。
4)精确识别法
精确识别法是现今能够保证扫描器精确识别病毒变种的唯一方法,常与第一代扫描技术结合使用。精确识别法也是利用校验和技术,只不过应用得更广、更复杂。它甚至能通过对整个病毒进行校验和计算来生成特征图。
3、基于内存扫描的反病毒技术
内存扫描反病毒技术是一种原理复杂的扫描技术,例如如何使一个病毒失去活性,如何对付只读型内核内存等系统底层知识。但是作为免杀爱好者,我们现阶段完全没必要知道这些,现在我们只需要知道内存反病毒的思想与概念即可。
内存扫描器一般与实时监控型扫描器协作,从理论上来讲,反病毒软件的文件扫描组件能识别的病毒,内存扫描器也能识别。但是不能从而武断地认为它们用的就是同一套特征码。就算对一个木马文件免杀成功,如果不对其做内存免杀,大多数在运行中的木马文件仍然会被反病毒软件杀掉。
但是为什么会出现这样的情况?这是因为程序在运行后会将自身释放到内存中,释放后的文件结构与未执行的文件相比有较大的差异。而且作为病毒来讲,被加载到内存就证明它要开始执行一些动作了,在病毒或木马初始化运行环境的时候,会让更多的可疑点暴露出来。
因此为了提高效率与准确性,反病毒软件厂商一般会为内存扫描组件单独定义一套新的特征码。
4、基于行为监控的反病毒技术
基于行为监控的反病毒技术一般需要与虚拟机、主动防御等技术配合工作。其原理是,主要针对病毒木马行为进行分析比对,如果某些程序在执行后会进行一些非正规的、可疑的操作,那么即便这是一个新生病毒,也会被拥有这种技术的反病毒产品拦截。
所谓的“行为”,就是指一个应用程序运行后的操作,对于一个程序来说,如果其在按照某种顺序执行某一系列的操作,我们就将其称为“行为特征”。
以一个典型的木马程序为例,它可能执行的操作步骤如下:
1)释放一些文件到系统关键目录中;
2)修改系统设置使这些新释放的文件可以自启动;
3)删除自身。
如果我们遇到一个执行以上操作的程序,那么它十有八九就是木马了。
5、基于新兴技术的反病毒技术
随着信息时代的正式来临,IT行业的各种技术也是日新月异,而位于计算机领域浪潮最前沿的反病毒行业自然也不甘落后。从智能查杀、计算机体检,到新兴时髦的云查杀,反病毒技术始终在吸引着广大网民的眼球。
(1)云查杀
云计算自从诞生以来便备受关注,云查杀当然也不例外。
而对于黑客们来说,云查杀也是最具有挑战性的,这主要取决于云查杀的特点以及跟随其衍生出来的技术。如果用一句话来概括云查杀,那么这句话就是“可信继承,群策群力”。
在理解这句话之前我们需要先了解云查杀及其特点。首先,云查杀的基本思路就是以服务器为脑,以所有用户的机器为触角,从而使得服务器可以随时知道每个用户的情况,如果其中某一个用户与其他用户对比发生了异常,那么服务器就会发出指令,让发生异常的机器检查出问题所在,并将问题反馈给服务器,从而在这个问题干扰到其他用户之前将其扼杀掉。
我们上面提到的“其他用户”就是云查杀整个信任机制的基石。举例来说,如果大多数机器上都运行过QQ.EXE,那么当一个新加入的机器也试图运行QQ.EXE时,服务器就认为这是正常的,否则服务器就会发出相应指令让用户的机器去阻止其运行。
1)可信继承
当然,整个云的信任机制是非常复杂的结构,其中包含用户参与的信任评价体系、反病毒专业人员参与的样本分析信任体系、服务端自动判断信任体系,以及基于数字签名的认证信任体系等。
在这其中,顶端的信任体系是由数字签名、样本分析构成的,这些顶端的信任体系在用户的机器上表现出来的形式就是“根可信进程”。所谓的“根可信进程”就是指可信进程链条的顶端,凡是由可信进程开启的新进程都被认为是可信的。
我们举个例子,假如进程A是具有数字签名的根可信进程,那么它在被用户直接执行时就不会触发反病毒软件的任何操作,而且由A进程创建的新进程也会成为可信进程。如果进程B是一个非可信进程,那么它在被用户执行时就会受到严密的监控,如果它在执行期间有什么敏感操作,其样本马上就会被提交给服务器处理。
由此一来,这个基于云的信任网络就会越来越庞大,其收集的信息也将越来越多。
2)群策群力
我们都知道云计算的特点就在于其具有分布性,而病毒木马的感染恰恰也具有分布性这一特点。这样一来,病毒木马感染的速度越快、感染的面积越广,其被云查杀捕获到的可能性就越大。
只要其中某一台计算机上发现新病毒,那么它马上就会被提交到服务端,在服务端快速更新后,所有在云中的计算机就都获得了对这种病毒的免疫力。
(2)双引擎查杀/多引擎查杀
“双引擎查杀”正如其字面意思一样,即同时运用两个反病毒引擎扫描病毒,其扫描的准确度会比单一反病毒引擎有所提高。
一般情况下,具有多个反病毒引擎的产品都会让用户选择扫描模式,例如是启用某一个引擎,还是启动所有引擎。因此黑客们在针对这种反病毒产品进行免杀时往往会在操作思路上将其分割为若干个反病毒产品,然后再一一攻破。
6、反病毒技术前沿
目前反病毒技术应用得比较广泛的是“主动防御”与“云查杀”这两项,而这两项技术中最为强大的环节就在于“虚拟机扫描技术”。所以这里介绍一下“虚拟机扫描技术”与“文件流查杀”思想的“鼻祖”—“代码仿真技术”。
代码仿真(Code Emulation)技术是一种极强大的病毒检测技术,这种技术很好地实现了一个程序运行所需要的基本虚拟环境。它的原理是通过一个虚拟机环境来仿真CPU和内存管理系统,从而模拟代码执行过程。
当反病毒软件决定将某个程序放到虚拟机中运行时,首先要将可执行文件的内容读取到内存缓冲区中,然后由仿真器中一个庞大的switch()语句对各个指令操作码进行逐一分析,最后执行。
switch()是一个多数计算机语言都会涉及的语句,它的作用就是使程序按照需求执行若干个备选方案中的某一个项或其中数项,在这里可以理解为:虚拟机要把程序的每一句指令操作码都逐一分析完毕后才去执行。
由此可见,代码仿真技术是十分消耗系统资源的,同样的一个应用程序,如果在虚拟机中运行,其执行速度将会降低到原来的几百分之一!但是面对目前个人计算机执行速度的飞跃,纵然降低到原来的几百分之一,也还是可以让我们轻松接受的,所以这种奢侈的查杀技术才得以推广。
文件流查杀与这种技术相比差异还是比较大的,它虽不需要模拟一个虚拟环境来运行病毒,但是它需要让病毒被人为地主动运行,当病毒运行时它会分析病毒释放到内存中的代码,直到病毒本来的代码被完全还原后才进行查杀,因此这种扫描算法虽不需要耗费大量的系统资源,但是却十分被动!
7、反病毒技术展望
未来计算机会朝着智能化的方向发展,计算机病毒实现智能化也是迟早的事,因此下一代反病毒软件也在朝着这个方向发展。
现在已经有人尝试了用神经网络来检测计算机病毒,业内的专家们称为“基于神经网络的启发式分析”。神经网络也是人工智能领域的一个分支,因此这个话题还是很令人激动的。研究者已经成功地用经过训练的神经网络检测出了复杂的EPO病毒。这种复杂的技术将来可能会与启发式分析及云查杀合为一体,从而产生出高识别率、小特征库且低误报的扫描器。
但是神经网络也有一个致命的缺点,它需要数量巨大的样本病毒供其分析学习,而且就现阶段来看,能力的提高也不是很明显。但这仍不能掩盖它的优点,病毒越多,它的查杀效果就越令人满意。
由此可见,神经网络的启发式分析是否能得到用户的认可并长期存在于市场中,还得看它最终“学习效率”的高低。
EPO(Entry-Point Obscuring)也称“入口点模糊”技术,这种技术出现的唯一目的就是与反病毒软件做对抗,利用这种技术编写的病毒具有极强的反探测、反查杀及反删除能力。
五、了解PE文件
可执行文件结构是操作系统的根基之一,Windows系统下的若干种文件,例如*.exe、*.dll、*.sys、*.ocx等都遵守PE文件结构的约定。
1、什么是PE文件
在Windows系统中,凡是可以直接以二进制形式被系统加载执行的文件都是PE文件,这一点可能会使部分朋友困惑。PE文件不像DOC等文件一样只有一个后缀,这个特性并不是其所独有的,例如我们非常熟悉的JPEG图像文件格式,其后缀就有*.jpg、*.jpeg与*.jfif等。
因此,PE文件其实就是一种文件格式,只不过这个文件格式是与我们息息相关的,无论是对于黑客还是对于反病毒工作者来说,透彻地了解PE文件格式都是非常重要的基本功。
PE文件中的PE就是Portable Executable(可移植的执行体)的简写,它是32位的Windows(简称Win32)环境自身所带的可执行文件格式。“可移植的执行体”意味着此文件格式是跨Win32平台的,也就是说,即使Windows运行在非Intel的CPU上,任何Win32平台的PE装载器都能识别和使用该文件格式,所以所有Win32下的可执行文件也都必须使用PE文件格式。
2、PE文件的结构
PE文件总的来说是由DOS文件头、DOS加载模块、PE文件头、区段表与区段5部分构成的,但是作为Windows下的一个文件格式,弄两个与DOS相关的结构干什么呢?其实如果程序在纯Windows环境下运行,则DOS(即MS-DOS,此为简称)文件头与DOS加载模块是根本用不上的,PE加载器会根据DOS文件头中的最后一个标志跳过DOS加载模块,直接转到PE文件头上。加上两个与DOS相关的结构完全是为了兼容性问题。
如图2所示就是以十六进制方式显示的PE文件的基本结构。
图2 PE文件的基本结构
通过图2可以发现,整个程序就是以DOS文件头的MZ标志位开始的,接下来就是DOS加载模块的标志性字符串This program cannot be run in DOS mode,这两个几乎就是恒定不变的,差不多每个Windows程序的前面都是这样一些信息。
下面有一个以字母PE为开头的文件块,这就是我们前面一直在讨论的PE文件头了。PE文件头的标准大小为224字节,由图2可见,里面有一个画了横线标记的问号与左面的十六进制信息E0相对应,这便是PE文件头体积的描述标记,十六进制的E0等于十进制的224,由此也不难看出PE文件头的大小为224个字节。
再往下就是以.text、.data与.rsrc组成的区段表了,区段表也称节表,它的作用就相当于一本书中的目录,你想看哪一章哪一节,只要按着目录标注的页数去找就可以了,PE文件的区段表也起着同样的作用,只不过它又附加了一些很有用的属性,例如读写权限与区段大小等,它的任务就是使PE加载器能准确快速地加载相应的区段。
通过区段名称我们可以大体猜出来这个区段里包含了些什么信息,在整个程序中能起到什么作用等。因为PE文件里的区段名称都是有相应的约定的,但是如果被人为地修改了就没有任何意义了。
由此可见,PE文件是一种结构组成十分科学的文件格式,这也对我们快速认识它有一定的帮助,只要你记住PE文件的这5个构成部分,你就可以向别人说,我了解PE文件!
六、免杀原理
免杀的最基本思想就是破坏特征,这个特征有可能是特征码,有可能是行为特征,只要破坏了病毒与木马所固有的特征,并保证其原有功能没有改变,一次免杀就能完成了。
特征码就是反病毒软件用于判断文件是否带病毒的一段独一无二的代码,这些特征码在不同的反病毒软件的病毒库中不尽相同。
随着反病毒软件的发展,特征码也逐渐细化为很多不同的分支,其中差距最大的就是文件特征码与内存特征码。由前面的反病毒软件原理可知,即便是文件反病毒,也分为若干种方法,而且方法不同,必然会使每种方法下所涉及的特征码存在细微的不同。
但是总体来说,特征码就是一种只在病毒或木马文件内才有的独一无二的特征,它或是一段字符,或是在特定位置调用的一个函数。总之,如果某个文件具有这个特征码,那反病毒软件就会认为它是病毒。反过来,如果将这些特征码从病毒、木马的文件中抹去或破坏掉,那么反病毒软件就认为这是一个正常文件了。
1、文件免杀原理
黑客们研究木马免杀的最终目标就是在保证原文件功能正常的前提下,通过一定的更改,使得原本会被查杀的文件免于被杀。
要达到不再被杀的目的方法有很多种,其中最直接的方法就是让反病毒软件停止工作,或使病毒木马“变”为一个正常的文件。
然而如何使一个病毒或木马变成一个正常文件,对于黑客们来说其实是一个比较棘手的问题,不过只要学会了一种免杀原理,其他的免杀方案也就触类旁通了。为了便于大家理解,我们将这些免杀方案分别进行讲解。
(1)改特征码免杀原理
所谓的特征码,我们可以将其理解为反病毒软件的黑名单。黑客们显然无法将木马从反病毒软件的黑名单中删除,所以他们要让病毒改头换面!例如原来黑名单中有“灰鸽子”这么一款木马,黑客们将其改头换面后不叫灰鸽子了,比如叫“白鸽子”!当然,这只是一个例子,现实中仅仅依靠改名是骗不了反病毒软件的。
就目前的反病毒技术来讲,更改特征码从而达到免杀的效果事实上包含着两种思想。
一种思想是改特征码,这也是免杀的最初方法。例如一个文件在某一个地址内有“灰鸽子上线成功!”这么一句话,表明它就是木马,只要将相应地址内的那句话改成别的就可以了,如果是无关痛痒的,直接将其删掉也未尝不可,如图3所示。
图3 通过修改特征字符串免杀
第二种是针对目前推出的校验和查杀技术提出的免杀思想,它的原理虽然仍是特征码,但是已经脱离纯粹意义上特征码的概念,不过万变不离其宗。其实校验和也是根据病毒文件中与众不同的区块计算出来的,如果一个文件某个特定区域的校验和符合病毒库中的特征,那么反病毒软件就会报警。所以如果想阻止反病毒软件报警,只要对病毒的特定区域进行一定的更改,就会使这一区域的校验和改变,从而达到欺骗反病毒软件的目的,如图4所示。这就是在定位特征码时,有时候定位了两次却得出不同结果的原因所在。
图4 通过修改区域内部分代码来免杀
(2)花指令免杀原理
花指令其实就是一段毫无意义的指令,也可以称之为垃圾指令。花指令是否存在对程序的执行结果没有影响,所以它存在的唯一目的就是阻止反汇编程序,或对反汇编设置障碍。
然而这种障碍对于反病毒软件来说同样也是致命的,如果黑客们的花指令添加得足够高明,就可以使木马很轻松地逃脱查杀!
但是,为什么它会影响反病毒软件的判断呢?通过前面的学习大家都已经知道,大多数反病毒软件是靠特征码来判断文件是否有毒的,而为了提高精度,现在的特征码都是在一定偏移量限制之内的,否则会对反病毒软件的效率产生严重的影响!而在黑客们为一个程序添加一段花指令之后,程序的部分偏移会受到影响,如果反病毒软件不能识别这段花指令,那么它检测特征码的偏移量会整体位移一段位置,自然也就无法正常检测木马了。
当然,这也仅仅是针对第一代扫描技术的方法,不过即便是反病毒软件采用虚拟机分析、校验和扫描或启发式分析,花指令同样会起到一定的作用,针对每种检测方法的不同,花指令所起到的作用亦不相同。它最根本的思想就是扰乱程序运行顺序,并为破解者(反病毒人员)设下陷阱。而如果花指令可以成功保护软件真正代码不被轻易反汇编,那么对于反病毒软件来说,它所检测的自然也就不是木马文件中真正的内容了。
(3)加壳免杀原理
说起软件加壳,简单地说,软件加壳其实也可以称为软件加密(或软件压缩),只是加密(或压缩)的方式与目的不一样罢了。
一般的加密是为了防止陌生人随意访问我们的数据。但是加壳就不一样了,它的目的是减少被加壳应用程序的体积,或避免让程序遭到不法分子的破坏与利用,例如最常见的共享软件,如果不对软件加以保护,那么这个软件就会很轻易地被破解,也就没有人去向软件的作者购买注册码了。
既然加壳后的软件还能正常运行,那么这些壳究竟将软件的哪些部分加密了呢?其实,我们可以从“加壳”这个词语本身着手,为什么不叫加密、防盗或其他的名称,而偏偏称其为加壳呢?
我们可以将未加壳的软件想象成美味的食物,太多的人想要得到它,想借此大饱口福!于是食物的主人就将其保存了起来,放到一个只有他能打开的硬壳里,这样就可以避免其他人打它的主意。而当自己的客人到来时,他可以很轻松地打开这个硬壳,供客人品尝……
上面所说壳就是我们加的保护,它并不会破坏里面的程序,当我们运行这个加壳的程序时,系统首先会运行程序的“壳”,然后由壳将加密的程序逐步还原到内存中,最后运行程序。这样一来,在我们看来,似乎加壳之后的程序并没有什么变化,然而它却达到了加密的目的,这就是壳的作用。
现在,我们再回头看看反病毒软件,如果说加壳之后的文件我们都无法将其还原,那么反病毒软件自然也就“看”不懂了。加密后的文件结构已经产生了天翻地覆的变化,原有的特征码早已不知去处,反病毒软件自然也就会认为它是一个正常的文件了。
由以上3种方法可知,基于文件的免杀基本上就是破坏原有程序的特征,无论是直接修改特征码还是加上一段花指令,抑或是将其加壳,其最后的目的只有一个,那就是打乱或加密可执行文件内部的数据。
2、内存免杀原理
自从文件免杀的方法在黑客圈子内部流传开后,反病毒公司将这场博弈升级到了另一个层次—内存中。
内存在计算机安全领域中向来就是兵家必争之地,从信息截取、软件破解,到内核Hook、修改内核,再到缓冲区溢出等,其主要战场都在内存中,由此可见内存是一个多么复杂而又变幻莫测的地方。
之所以说内存复杂,是因为一般情况下内存是数据进入CPU之前的最后一个可控的物理存储设备。在这里,数据往往都已经被处理成可以直接被CPU执行的形式了,像我们前面讲的加壳免杀原理在这里也许就会失效了。
我们知道,CPU不可能是为某一款加壳软件而特别设计的,因此某个软件被加壳后的可执行代码CPU是读不懂的。这就要求在执行外壳代码时,要先将原软件解密,并放到内存里,然后再通知CPU执行。
如果是这样,那么从理论上来讲任何被加密的可执行数据在被CPU执行前,肯定是会被解密的,否则CPU就无法执行。也正是利用这个特点,反病毒公司便在这里设了一个关卡,这就使得大部分运用原有文件免杀技巧处理过的病毒木马纷纷被杀。
其实,与上面这个原因相比较,反病毒公司选择扫描内存更多是从战略角度出发的。
因为将要被执行的程序肯定比未执行程序的威胁更大。即便是再厉害的病毒木马,只要能保证它不被执行,它在用户的计算机中最多也就算是一个垃圾文件,就不会对用户及网络构成任何威胁。
但是黑客们又是如何对抗内存查杀的呢?其实套路与文件查杀一样,因为杀毒软件的内存扫描原理与硬盘上的文件扫描原理都是一样的,都是通过特征码比对的,只不过为了制造迷惑性,大多数反病毒公司的内存扫描与文件扫描采用的不是同一套特征码,这就导致了一个病毒木马同时拥有两套特征码,必须要将它们全部破坏掉才能躲过反病毒软件的查杀。
因此,除了加壳外,黑客们对抗反病毒软件的基本思路没变。而对于加壳,只要加一个会混淆程序原有代码的“猛”壳,其实还是能躲过杀毒软件的查杀的。
3、行为免杀原理
当文件查杀与内存查杀都相继失效后,反病毒厂商便提出了行为查杀的概念,从最早的“文件防火墙”发展到后来的“主动防御”,再到现在的部分“云查杀”,其实都应用了行为查杀技术。
而对于行为查杀,黑客们会怎样破解呢?我们都知道一个应用程序之所以被称为病毒或者木马,就是因为它们执行后的行为与普通软件不一样。
因此从2007年行为查杀相继被大多数反病毒公司运用成熟后,黑客免杀技术这个领域的门槛也就一下提高到了顶层。
反病毒公司将这场博弈彻底提高到了软件领域最深入的一层—系统底层,这就使得黑客们需要掌握的各种高精尖知识爆炸式增长,这一举动将大批的黑客技术的初学者挡在了门外。
然而由于初期的行为查杀刚刚兴起,很多反病毒产品的主动防御模块把关不严,应用的技术也并不先进,从而导致了一大批内核级病毒木马的出现。而随着技术的逐渐升温,攻防双方的技术最后变得势均力敌,反病毒公司得益于计算机领域先入为主的定律,使得黑客们从这时开始陷入被动。
因此黑客免杀技术发展到现在,已经出现了向渗透入侵等领域靠拢的趋势,黑客们将能躲过主动防御的方法称为0Day,并且越来越多的木马选择使用本地缓冲区溢出等攻击手法来突破主动防御。
但是反病毒爱好者们也不能因此麻痹大意,黑客领域中的任何技术从来都是靠思路与技术这两条腿走路的,免杀技术也不例外。黑客技术的初学者仍然想出了非常多的方法,有效地突破了现在的主动防御与云查杀。
七、工具脱壳技巧
在真正开始学习免杀技术之前还是需要掌握一定的脱壳技巧的,因为很多木马都是加过壳的,而且这些加壳后的木马已经被反病毒公司提取了特征,所以如果黑客们不能将其脱壳,也就无法进行有效的免杀。
1、壳的分类
所谓的“壳”就是一种对软件进行保护的加密程序,下面介绍壳的种类及其特点。
(1)压缩壳
压缩壳的主要目的是压缩应用程序的体积,例如最稳定的UPX可以将一般的应用程序压缩到原体积的30%左右。
压缩壳并不会对被加壳程序本身做任何修改,而是直至将其换成一种更加节省空间的存储方式,其目的大致类似于我们经常使用的RAR或ZIP。经过压缩壳处理过的程序在真正被CPU执行前是会自动解压缩(解密)的。
(2)加密壳
加密壳的主要目的是保护原程序不被破解,一般情况下,经过加密壳处理的应用程序体积会增加,但也有部分加密壳结合了压缩壳的特性,会在加密完成后再进行压缩。
而且一般情况下,加密壳会对原程序进行一定的修改,例如代码乱序、代码混淆等,因此经过加密壳处理的程序即便是提交给CPU去执行,原程序的代码也还是发生了改变。
所谓的代码乱序,就是将本来线性执行的代码分成若干份后颠倒存储位置,再通过跳转指令将其按照正确的顺序连接起来。这样对于CPU来说其执行的程序逻辑没变,只是多了几条跳转指令而已,但是这段代码在硬盘上或内存中的组织排列方式却发生了很大的变化。
而代码混淆的本质其实就是将一条指令扩展为若干条指令,例如原本是一个计算"1+1"的代码,但是混淆后就变成了"1+10-9+0-0+1-1"了,虽然最后的结果一样,但是程序本身的代码甚至部分逻辑都发生了变化。
(3)虚拟机保护壳
虚拟机保护壳是近几年在软件安全领域内流行起来的一种非常强悍的加密保护方案。它的关键技术就在于实现了一个软件版的CPU,被加密的可执行代码已经不再遵守Intel制定的OPCode标准了,而是执行由虚拟机作者本身制定的非公开的、动态的CPU指令编码解码标准,我们通常称之为TextCode。
虚拟机保护壳会将被保护程序的可执行代码重新编码为自己的软件CPU可以识别的格式,并进行存储、加载及模拟执行。因此在任何时候,原程序代码对外界来说都将是一个彻底的黑盒,任何人都很难破解。
由于CPU指令本身的复杂性(OPCode的解析需要通过3张复杂的表相对照才能顺利进行),因此被虚拟机加密过的可执行代码在业内至今仍没有人可以完全攻破。而更为强悍的是,现今的虚拟机软件CPU的编码格式已经是随机生成的了。
这里的虚拟机主要指的是软件虚拟机,由于它是用软件虚拟出来的,因此在虚拟机中的任何操作均无法对真正的机器(宿主机)产生任何不可控的影响。而虚拟机按照应用领域的不同分为如下几种类型。
模拟虚拟机:它是一个模拟真实计算机运行环境的软件,我们可以像操作真实机器一样为这个虚拟的机器安装操作系统和应用软件,甚至在其中运行病毒木马做测试。这种软件的典型代表为VMware。
反病毒虚拟机:这种虚拟机一般都是在杀毒软件中以一个引擎的方式存在的,其本身可以为应用程序顺利运行提供一个必要的环境,以捕获此应用程序的行为。
软件保护虚拟机:这种虚拟机的主要目的是加密应用程序,其本身只负责简单的指令解码及堆栈模拟工作,然后将解码后的操作分配给软件CPU的不同分支去处理,直到被加密软件需要与系统发生交互时,才将准备好的请求及堆栈环境提交给系统执行。
而OPCode则是一个稍微复杂些的概念。
我们首先要知道一件事,即我们所写的程序在没经过编译或解析时是无法执行的,例如用C语言写一个"nNumA=1+2;"语句,这显然是不会被CPU直接执行的。要让CPU执行这行代码,就需要经历一个编译的过程。
在编译器扫描完这行C语言代码后,有可能会生成以下汇编代码:
严谨一点说,这些汇编代码都应该被称为“助记符(Mnemonic)”,然后再由汇编器生成如下由0和1组成的机器码:
十六进制:50 B8 01 00 00 00 83 C0 02 89 45 04 58
二进制:1010 0001 0111 0000 0000 0010 0000 0000 0000 0000 0000 0001 0000 0111 1000 000
这些可以直接被CPU执行的机器码才是我们前面所说的OPCode。
由以上3种壳我们可以发现,其实所谓的“壳”就是包裹在被保护的应用程序外面的一段代码,这段代码的使命是保证里面被加密的应用程序能够按照其原有的逻辑顺利执行。
2、免杀与脱壳是什么关系
我们都知道黑客们通过加壳的方式来躲过杀毒软件的查杀,那么脱壳(与加壳相反的过程被称为脱壳)与免杀又是什么关系呢?
黑客们想要使用的某种恶意软件有可能已经被其他人做过类似的加密处理了,然而这个被加密的版本又恰好被杀毒软件捕获到了,所以如果黑客们想要再次处理这个恶意软件,就要先去掉那层无用的保护,因此这也是免杀技术泛滥的一种表现。
另外,如果您是反病毒爱好者的话,那么掌握脱壳技巧也是与病毒木马对抗的基本功。
3、使用专用脱壳工具脱壳
针对不同的壳,网上有很多专用的脱壳工具,它们常常可以将某个壳的所有版本完全脱掉,脱壳的效率与可靠性往往也是最高的。
这里我们先将一个程序加一层UPX的壳,双击运行UPX后单击“打开”按钮选择要加壳的程序,如图5所示。打开后程序会自动跳到“压缩”选项卡下,单击选项卡下的“→”按钮即可成功加壳,如图6所示。
图5 选择要加壳的程序
图6 单击“→”按钮加壳
加壳完毕后运行PEID。PEID是一款用来查看文件信息的强大工具,用它可查看文件的加壳状态,如果想要用其加载某个程序,像如图7所示的那样将文件拖拽到PEID的界面上即可打开该文件。打开文件后发现信息栏里显示UPX 0.89.6-1.02/1.05-1.24(Delphi)stub->Markus&Laszlo这段信息,如图8所示。
图7 打开文件
图8 分析后显示的信息
以上信息的大致意思是这个文件被UPX加壳了,壳的版本可能是0.89.6-1.02或1.05-1.24。其他的信息暂且不用去管,只需要记住开始部分是文件的状态,包括加壳种类或编写语言等信息,如果显示的是编写语言信息,则说明该程序没有被加壳。但是值得大家注意的是,现在通过一定的处理已经可以使加壳文件欺骗PEID了。
凡是被加壳的文件信息中都有一个“->”符号,它代表后面的内容为这个壳的扩展信息。
下面就开始为这个文件脱壳。虽然针对UPX有一款名为Anti-UPX-Srambler的脱壳软件,但是就目前的情况来看,它已经不能脱掉UPX的壳了,因为较新版本的UPX本身就带有脱壳功能,所以这款脱壳软件也就停止了更新了。我们打开一个较新的UPX后加载那个已加壳的文件,发现UPX会自动打开相应对话框,并且其下的“解压”选项卡已经默认选中,如图9所示。我们只需单击“执行”按钮即可成功地将程序脱壳。
图9 单击“执行”按钮脱壳
4、使用通用脱壳工具脱壳
既然叫做通用脱壳工具,肯定是能脱很多壳的,在这些工具里比较成熟的就要数Quick Unpack了,它不但可以脱去已知的大部分壳,还可以脱去一些经过加密的或变异的未知壳。
但是这里首先为大家展示一下怎样使用PEID脱壳,因为我们平多用PEID查壳,所以如果可以直接用PEID来脱壳将是一件比较方便的事,而且PEID的脱壳效果也不错。我们先用PEID打开一个已加壳的文件,如图10所示。单击“=>”按钮,依次选择“插件”→“PEID通用脱壳器”,在弹出的对话框中单击“->”按钮自动寻找入口点,然后单击“脱壳(U)”按钮即可成功脱壳,如图11所示。脱壳过程中可能会提示是否使用ImpREC重建输入表,单击“是”按钮即可。
图10 打开PEID的插件菜单
图11 PEID的通用脱壳插件
但是有时候单击“->”按钮后会运行原程序,并且PEID无法将其自动关闭,这时只需手动关闭即可。如果使用PEID无法脱壳或脱壳后的程序不可用,就要看看PEID是否能正确读出壳的信息了,如果能正确读出,我们可以使用超级巡警发布的基于虚拟机的万用脱壳工具VMUnpacker。VMUnpacker的特点就是只要它能正确识别壳的信息,一般情况下都可以完美脱壳。如果PEID无法正确读出壳的信息,那就要试试Quick Unpack了。但是Quick Unpack也有不好的地方,因为它的使用需要一定的技巧,并且有注意事项。
微信公众号:计算机与网络安全
ID:Computer-network